package net.lgy.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import net.lgy.controller.req.RecycleDelRequest;
import net.lgy.controller.req.RecycleRestoreRequest;
import net.lgy.dto.AccountFileDTO;
import net.lgy.interceptor.LoginInterceptor;
import net.lgy.service.RecycleService;
import net.lgy.util.JsonData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 回收站控制器
 * 负责处理与回收站相关的所有HTTP请求，包括查看回收站文件列表、彻底删除文件和还原文件等操作
 */
@RestController
@RequestMapping("/api/recycle/v1")
@Slf4j
@Tag(name = "回收站管理", description = "提供回收站相关的操作功能，包括查看、删除和还原文件")
public class RecycleController {

    @Autowired
    private RecycleService recycleService;

    /**
     * 获取当前用户的回收站文件列表
     * 从ThreadLocal中获取当前登录用户的账号ID，调用服务层方法获取回收站文件列表
     *
     * @return JsonData 包含回收站文件列表的响应对象
     */
    @GetMapping("/list")
    @Operation(summary = "获取回收站文件列表", description = "查询当前登录用户回收站中的所有文件信息")
    @ApiResponses({
            @ApiResponse(responseCode = "200", description = "获取成功",
                    content = @Content(schema = @Schema(implementation = JsonData.class))),
            @ApiResponse(responseCode = "500", description = "获取失败",
                    content = @Content(schema = @Schema(implementation = JsonData.class)))
    })
    public JsonData list(){
        // 从ThreadLocal中获取当前登录用户的账号ID
        Long accountNo = LoginInterceptor.threadLocal.get().getAccountNo();
        log.info("用户[{}]查询回收站文件列表", accountNo);

        // 调用服务层方法获取回收站文件列表
        List<AccountFileDTO> list = recycleService.listRecycleFile(accountNo);

        // 根据查询结果返回相应的响应
        return list != null ? JsonData.buildSuccess(list) : JsonData.buildError("获取回收站列表失败");
    }

    /**
     * 彻底删除回收站中的文件
     * 接收删除请求参数，设置当前用户账号ID，调用服务层方法执行删除操作
     *
     * @param request 包含要删除的文件ID列表的请求对象
     * @return JsonData 包含删除结果的响应对象
     */
    @PostMapping("/delete")
    @Operation(summary = "彻底删除回收站文件", description = "将回收站中的文件彻底删除，不可恢复")
    @ApiResponses({
            @ApiResponse(responseCode = "200", description = "删除成功",
                    content = @Content(schema = @Schema(implementation = JsonData.class))),
            @ApiResponse(responseCode = "500", description = "删除失败",
                    content = @Content(schema = @Schema(implementation = JsonData.class)))
    })
    public JsonData delete(
            @Parameter(description = "删除请求参数，包含要删除的文件ID列表", required = true)
            @RequestBody RecycleDelRequest request){
        // 从ThreadLocal中获取当前登录用户的账号ID
        Long accountNo = LoginInterceptor.threadLocal.get().getAccountNo();
        request.setAccountNo(accountNo);
        log.info("用户[{}]请求彻底删除回收站文件，文件ID列表：{}", accountNo, request.getFileIds());

        // 调用服务层方法执行删除操作
        int res = recycleService.deleteRecycleFile(request);

        // 根据删除结果返回相应的响应
        return res > 0 ? JsonData.buildSuccess("删除成功") : JsonData.buildError("删除失败或回收站本来就空的");
    }

    /**
     * 还原回收站中的文件
     * 接收还原请求参数，设置当前用户账号ID，调用服务层方法执行还原操作
     *
     * @param request 包含要还原的文件ID列表和目标路径的请求对象
     * @return JsonData 包含还原结果的响应对象
     */
    @PostMapping("/restore")
    @Operation(summary = "还原回收站文件", description = "将回收站中的文件还原到原来的位置或指定位置")
    @ApiResponses({
            @ApiResponse(responseCode = "200", description = "还原成功",
                    content = @Content(schema = @Schema(implementation = JsonData.class))),
            @ApiResponse(responseCode = "500", description = "还原失败",
                    content = @Content(schema = @Schema(implementation = JsonData.class)))
    })
    public JsonData restore(
            @Parameter(description = "还原请求参数，包含要还原的文件ID列表和目标路径", required = true)
            @RequestBody RecycleRestoreRequest request){
        // 从ThreadLocal中获取当前登录用户的账号ID
        Long accountNo = LoginInterceptor.threadLocal.get().getAccountNo();
        request.setAccountNo(accountNo);
        log.info("用户[{}]请求还原回收站文件，文件ID列表：{}，目标路径：{}",
                accountNo, request.getFileIds().toArray(), request.getFileIds().toArray());

        // 调用服务层方法执行还原操作
        int res = recycleService.restoreRecycleFile(request);

        // 根据还原结果返回相应的响应
        return res > 0 ? JsonData.buildSuccess("还原成功") : JsonData.buildError("还原失败");
    }



}